/*
 * PlayerView.java
 *
 * @author Michael Hansen
 * @author Lukas Thuernagel
 * @author Soeren Warszus
 */

package risk.player;
import javax.swing.*;
import java.awt.*;

/**
 *
 */
public class PlayerView extends JPanel{
    /**
     * Zum View zugehoeriges Model
     */
    private PlayerModel player;
    
    /**
     * Label das den aktiven Spieler anzeigt
     */
    private JLabel activeLabel;
    
    /**
     * Label das den aktiven Spieler anzeigt
     */
    private JLabel stateLabel;
    
    /**
     * Anzeige, wieviele Truppen zu verteilen sind
     */
    private JLabel armyLabel;
    
    /**
     * Anzeige der Anzahl Länder
     */
    private JLabel territoryLabel;
    
    /**
     * Anzeige der Anzahl Kontinente
     */
    private JLabel continentLabel;
    
    /**
     * Anzeige der Anzahl Karten
     */
    private JLabel cardLabel;
    
    /**
     * Konstruktor zum Anlegen einer neuen Anzeigen 
     * eines Spielers
     * 
     * @param PlayerModel pm der angezeigt werden soll.
     */
    public PlayerView(PlayerModel pm) {
        this.player = pm;
        this.player.registerBoardView(this);
        initializeView();
    }
    
    /**
     * Das zurgehoerige Model zureuckgeben
     *
     * @return PlayerModel 
     */
    public PlayerModel getPlayerModel(){
        return this.player;
    }
    
    /**
     * Erstellen der Darstellung des Spielers Players auf dem Spielbrett
     * Name des Spielers auf einem Label
     * Farbe des Spielers wird als Hintergrund gesetzt
     */
    public void initializeView(){
        //LayoutManager
        GridBagLayout gbl = new GridBagLayout();
        this.setLayout(gbl);
        
        /**
         * Fuer jede Komponente wird ein GridBagConstraints angelegt, damit 
         * alte Werte nicht geloescht werden muessen
         */
        //Setzen, ob der Player aktiv ist
        //GridBagConstraints zum vergeben der Werte fuer den nameLabel
        GridBagConstraints gbcActive = new GridBagConstraints();
        gbcActive.gridwidth = GridBagConstraints.REMAINDER;
        gbcActive.gridheight = 2;
        gbcActive.insets = new Insets( 0, 5, 0, 5);
        gbcActive.anchor = GridBagConstraints.WEST;
        // Label
        activeLabel = new JLabel();
        activeLabel.setText("Aktiv");
        activeLabel.setVisible(false);
        gbl.setConstraints(activeLabel,gbcActive);
        this.add(activeLabel);
        
        //Setzen, in welcher Phase ein Spieler ist
        //GridBagConstraints zum vergeben der Werte fuer den nameLabel
        GridBagConstraints gbcState = new GridBagConstraints();
        gbcState.gridwidth = GridBagConstraints.REMAINDER;
        gbcState.gridheight = 2;
        gbcState.insets = new Insets( 0, 5, 0, 5);
        gbcState.anchor = GridBagConstraints.WEST;
        // Label
        stateLabel = new JLabel();
        stateLabel.setText("Phase: "+this.player.getStateString());
        stateLabel.setVisible(false);
        gbl.setConstraints(stateLabel,gbcActive);
        this.add(stateLabel);
        
        //Wenn Phase 'Truppenverteilung': Setzen, wieviele Truppen zu verteilen sind
        //GridBagConstraints zum vergeben der Werte fuer den nameLabel
        GridBagConstraints gbcArmy = new GridBagConstraints();
        gbcArmy.gridwidth = GridBagConstraints.REMAINDER;
        gbcArmy.gridheight = 2;
        gbcArmy.insets = new Insets( 0, 5, 0, 5);
        gbcArmy.anchor = GridBagConstraints.WEST;
        // Label
        armyLabel = new JLabel();
        armyLabel.setText("Truppenanzahl: "+this.player.getUnitCount());
        armyLabel.setVisible(false);
        gbl.setConstraints(armyLabel,gbcActive);
        this.add(armyLabel);
        
        //Setzen des Namens
        //GridBagConstraints zum vergeben der Werte fuer den nameLabel
        GridBagConstraints gbcName = new GridBagConstraints();
        gbcName.gridwidth = GridBagConstraints.REMAINDER;
        gbcName.gridheight = 2;
        gbcName.insets = new Insets( 0, 5, 0, 5);
        gbcName.anchor = GridBagConstraints.WEST;
        // Label
        JLabel nameLabel = new JLabel();
        nameLabel.setText(player.getPlayerName());
        nameLabel.setVisible(true);
        gbl.setConstraints(nameLabel,gbcName);
        
        this.add(nameLabel);
        
        //Hintergrundfarbe auf die Farbe des Players setzen
        this.setBackground(player.getPlayerColor());
        
        //Anzeige der Anzahl Laender
        //GridBagConstraints zum vergeben der Werte fuer das territoryLabel
        GridBagConstraints gbcTerritory = new GridBagConstraints();
        gbcTerritory.gridwidth = GridBagConstraints.REMAINDER;
        gbcTerritory.gridheight = 2;
        gbcTerritory.insets = new Insets( 0, 5, 0, 5);
        gbcTerritory.anchor = GridBagConstraints.WEST;
        //Anzeigen der Laenderanzahl mit einem JLabel
        territoryLabel = new JLabel();
        territoryLabel.setText("Gebiete: "+player.getTerritoryCount());
        territoryLabel.setFont(new Font("Verdana",Font.PLAIN, 10 ));
        territoryLabel.setVisible(true);
        gbl.setConstraints(territoryLabel,gbcTerritory);
        this.add(territoryLabel);
        
        //Anzeige der Anzahl Kontinente
        //GridBagConstraints zum vergeben der Werte fuer das continentLabel
        GridBagConstraints gbcContinent = new GridBagConstraints();
        gbcContinent.gridwidth = GridBagConstraints.REMAINDER;
        gbcContinent.gridheight = 2;
        gbcContinent.insets = new Insets( 0, 5, 0, 5);
        gbcContinent.anchor = GridBagConstraints.WEST;
        //Anzeigen der Kontinentanzahl mit einem JLabel
        continentLabel = new JLabel();
        continentLabel.setText("Kontinent: "+player.getContinentCount());
        continentLabel.setFont(new Font("Verdana",Font.PLAIN, 10 ));
        continentLabel.setVisible(true);
        gbl.setConstraints(continentLabel,gbcContinent);
        this.add(continentLabel);
        
        //Anzeige der Kartenanzahl
        //GridBagConstraints zum vergeben der Werte fuer das cardLabel
        GridBagConstraints gbcCard = new GridBagConstraints();
        gbcCard.gridwidth = GridBagConstraints.REMAINDER;
        gbcCard.gridheight = 2;
        gbcCard.insets = new Insets( 0, 5, 0, 5);
        gbcCard.anchor = GridBagConstraints.WEST;
        //Anzeigen der Kartenanzahl mit einem JLabel
        cardLabel = new JLabel();
        cardLabel.setText("Karten: "+player.getCardList().size());
        cardLabel.setFont(new Font("Verdana",Font.PLAIN, 10 ));
        cardLabel.setVisible(true);
        gbl.setConstraints(cardLabel,gbcCard);
        this.add(cardLabel);
        
        //JPanel anzeigen
        this.setVisible(true);
    }
    
    /**
     * Setzt die Anzeige des Spieler, ob er aktiv oder nicht aktiv
     * ist
     *
     * @param Boolean bool Wahrheitswert, ob angezeigt werden soll, dass er aktiv ist
     */
    public void setActive(Boolean bool){
        this.activeLabel.setVisible(bool);
        if(bool){
            //this.setState(this.player.getStateString());
            this.stateLabel.setVisible(true);
            this.territoryLabel.setText("Gebiete: "+player.getTerritoryCount());
            continentLabel.setText("Kontinent: "+player.getContinentCount());
            cardLabel.setText("Karten: "+player.getCardList().size());
        }
        else{
            this.stateLabel.setVisible(false);
            this.armyLabel.setVisible(false);
        }
    }
    
    /**
     * Setzt den Status neu
     * 
     * @param String state
     */
    public void setState(String state){
        this.stateLabel.setText("Phase: "+state);
        if(state.compareTo("Truppenverteilung")==0 || state.compareTo("Truppenaufbau")==0){
            this.armyLabel.setText("Truppenanzahl: "+this.player.getUnitCount());
            this.armyLabel.setVisible(true);
        }
        else{
            this.armyLabel.setVisible(false);
        }
    }
    
    /**
     * Update des Views
     */
    public void updateView(){
        this.territoryLabel.setText("Gebiete: "+player.getTerritoryCount());
        continentLabel.setText("Kontinent: "+player.getContinentCount());
        cardLabel.setText("Karten: "+player.getCardList().size());
        if(this.player.getState()==1){
            this.armyLabel.setText("Truppenanzahl: "+this.player.getUnitCount());
        }
    }
}
